.. _cmsHomeMoveStart: cmsHomeMoveStart ================================ -------------------------------- SYNOPSYS ````````````` .. code-block:: none VT_I4 cmsHomeMoveStart ([in] VT_I4 BoardID, [in] VT_I4 Axis) DESCRIPTION ````````````` - 원점복귀 작업을 수행합니다. cmsHomeMove() 함수는 모션이 완료되기 전까지 반환되지 않으며, cmsHomeMoveStart() 함수는 모션을 시작시킨 후에 바로 반환됩니다. \ - 이 함수의 사용과 호출에 있어, 제공된 ㈜커미조아의 함수 헤더 Visual Basic 에서는 함수의 첨두어 cms 가 붙지 않습니다. PARAMETER ````````````` ▶ BoardId: 사용자가 설정한 디바이스(보드) ID. ▶ Axis : 축(채널) 번호. 축번호는 상수값으로 0번째 채널을 기준 채널로 임의의 채널을 설정할 수 있습니다. ▶ IsBlocking : 완료될 때까지 기다리는 동안 윈도우 메시지를 블록(Blocking)할 것인지를 결정합니다. .. csv-table:: :widths: 10 90 :header-rows: 1 :stub-columns: 0 Value, Meaning "| 0 또는 cmsFALSE", " | 블록(Blocking)을 하지 않습니다. 따라서 해당 모션이 | 완료되는 동안에도 윈도우 이벤트를 처리합니다." "| 1 또는 cmsTRUE"," | 블록(Blocking)을 합니다. 따라서 해당 모션이 완료되는 | 동안에는 윈도우 이벤트가 처리되지 않습니다." RETURN VALUE ````````````` +------------+-----------+ | Value | Meaning | +============+===========+ | 음수 | 수행 실패 | +------------+-----------+ | ERR_NONE | 수행 성공 | +------------+-----------+ REFERENCE ``````````````` - cmsHomeMoveStart() 함수를 사용하는 경우에는 cmsSxIsDone(), cmsSxWaitDone() 또는 cmsMxIsDone(), cmsMxWaitDone() 함수를 사용하여 모션의 완료를 확인(確認)할 수 있습니다. 그러나 가장 바람직한 방법은 cmsHomeWaitDone() 함수를 사용하는 것이 좋습니다. \ - cmsHomeMove() 함수를 사용하는 경우에는 내부적으로 루프를 수행하면서 모션이 완료되기를 기다리는데, 이때 “Blocking Mode”설정에 따라 윈도우 이벤트를 처리하는 방식이 달라집니다. \ - INP 입력신호가 Enable로 설정되었으면 Command 펄스 출력이 완료되어도 INP 입력이 ON이 되기 전까지는 모션이 완료되지 않은 것으로 간주되어 반환되지 않습니다. .. note:: "윈도우 이벤트란느 것은 무엇입니까?" 윈도우 운영체제는 Event Driven 혹은 Message Driven 방식의 구조로 되어 있습니다. 각 응용프로그램은 메시지 큐(Queue)를 가지고 있으며, 정확히 말하면, 메시지를 사용해 이벤트를 통지하는 방식으로 설계되어 있습니다. 윈도우 메시지를 처리한다는 것은 메시지 큐에서 메시지를 하나씩 꺼내서 윈도우 프로시저에 전송한다는 것을 의미하며, 이것은 그 행선지가 되는 윈도우에 전송되어 처리됩니다. EXAMPLE ``````````` - 본 예제는 cmsHomeMoveStart() 함수를 이용하여 X1, Y1 축의 원점복귀를 수행하는 함수입니다. 원점복귀에 대한 환경설정은 이미 이루어진 것으로 가정합니다. .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #define DEV0 0 #include "ComiSSCNET3_SDK.h" #include "ComiSSCNET3_SDK_Def.h" /************************************************************ * OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이 * 적용되는 부분을 의미합니다. *************************************************************/ void OnProgramInitial() { } long m_nNumDevices; long m_DeviceList[16]; long m_nNumAxes; cmsLoadDll(); if(cmsGnLoadDevice(&m_nNumDevices, m_DeviceList, &m_nNumAxes) != ERR_NONE) { //Handle 은 사용자가 생성한 폼의 핸들 값입니다. // 에러메시지 출력 return; } /*************************************************************** * OnHomeSetSpeed : 이 함수는 속도설정의 변경이 필요할 때 * 호출되는 가상의 함수 입니다. 이때 m_fVwork, m_fAcc, m_fDec 변수를 * 통하여 속도, 가속도 , 감속도 값이 적절하게 전달된다고 가정합니다. ***************************************************************/ void OnHomeSetSpeed() { //각 축(Axis)의 기본 속도를 설정 합니다. //X1축의 홈복귀 모드를 설정합니다. cmsHomeSetConfig(DEV0, cmsX1, cmsHPID_HOME_MODE, cmsHOME_MODE_ORG); //Y1축의 홈복귀 모드를 설정합니다. cmsHomeSetConfig(DEV0, cmsY1, cmsHPID_HOME_MODE, cmsHOME_MODE_ORG); //X1축의 홈복귀 방향을 설정합니다. cmsHomeSetConfig(DEV0, cmsX1, cmsHPID_HOME_DIR, cmsDIR_N); //Y1축의 홈복귀 방향을 설정합니다. cmsHomeSetConfig(DEV0, cmsY1, cmsHPID_HOME_DIR, cmsDIR_N); //X1축의 홈복귀 추가 이동 거리를 설정합니다. cmsHomeSetOffset(DEV0, cmsX1, 1000); //Y1축의 홈복귀 추가 이동 거리를 설정합니다. cmsHomeSetOffset(DEV0, cmsY1, 1000); // X1축 홈복귀 속도패턴 설정 // cmsHomeSetSpeedPattern(DEV0, cmsX1, 0, cmsSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0); cmsHomeSetSpeedPattern(DEV0, cmsX1, 1, cmsSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1); cmsHomeSetSpeedPattern(DEV0, cmsX1, 2, cmsSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2); // Y1축 홈복귀 속도패턴 설정 // cmsHomeSetSpeedPattern(DEV0, cmsY1, 0, cmsSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0); cmsHomeSetSpeedPattern(DEV0, cmsY1, 1, cmsSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1); cmsHomeSetSpeedPattern(DEV0, cmsY1, 2, cmsSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2); } /*************************************************************** * OnHomeReturn : 이 함수는 가상의 함수로서 원점복귀를 실행합니다. ****************************************************************/ void OnHomeRetrun() { // X1축 원점복귀 시작 // if(cmsHomeMoveStart(DEV0, cmsX1, cmsFALSE) != ERR_NONE){ // 에러메시지 출력 return; } // Y1축 원점복귀 시작 // if(cmsHomeMoveStart(DEV0, cmsY1, cmsFALSE) != ERR_NONE){ // 에러메시지 출력 return; } // X1&Y1 두축의 원점복귀 작업이 완료될 때까지 기다린다. // if(cmsHomeWaitDone(DEV0, cmsX1, cmsFALSE) != ERR_NONE) // 에러메시지 출력 if(cmsHomeWaitDone(DEV0, cmsY1, cmsFALSE) != ERR_NONE) // 에러메시지 출력 ///////////////////////////////////////////////////////////// //위의 cmsSxWaitDone() 함수 대신에 아래와 같이 cmsMxWaitDone() //함수를 사용하여 두축의 작업완료를 기다리는 것을 한번에 수행할 수 있다. // int nAxes[2] = {cmsX1, cmsY1}; // cmsMxWaitDone(2, nAxes, cmsFALSE); // 원점복귀의 성공 여부를 확인(確認)하여 처리한다. // long dwIsSuccessX, dwIsSuccessY; cmsHomeGetSuccess(DEV0, cmsX1, &dwIsSuccessX); cmsHomeGetSuccess(DEV0, cmsY1, &dwIsSuccessY); if(dwIsSuccessX && dwIsSuccessY){ MessageBox(NULL, “원점복귀를 성공적으로 수행하였습니다.”, “Message”, MB_OK); }else{ long dwErrCode; char szErrMsg[CMS_MAX_STR_LEN_ERR]; char szErrReason[CMS_MAX_STR_LEN_ERR]; cmsErrGetLastCode(DEV0, nAxis, &dwErrCode); cmsErrGetString(DEV0, dwErrCode, szErrReason, CMS_MAX_STR_LEN_ERR); sprintf(szErrMsg, “다음과 같은 이유로 원점복귀에 실패하였습니다.\n%s”, szErrReason); MessageBox(NULL, szErrMsg, “Motion Error”, MB_OK | MB_ICONERROR); } } -------------------------------------------------------------------------------------